﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using ControlsLib;
using GestionePolveriLib.BL;
using BrightIdeasSoftware;
using GestionePolveriLib.Facades;
using GestionePolveri2.Filters;
using FrameworkLib.Facades.Paging;
using FrameworkLib.Filters;
using GestionePolveri2.DAL;
using GestionePolveriLib.Utilities;
using GestionePolveriLib.Facades.Extensions;
using GestionePolveriLib.BL.FilterBags;
using FrameworkLib.Configurations.FormsConfiguration;
using FrameworkLib.Configurations.FormsConfiguration.BL;

namespace GestionePolveri2
{
    public partial class ComposizioneColoreManagerExt2 : ComposizioneColoreBaseExt2
    {
        private static Color COLORE_RIGA1 = Color.White;
        private static Color COLORE_RIGA2 = Color.Lavender;

        private ComposizioneColoreFacadeExt pf = null;
        private List<ComposizioneColore2> m_composizioneColore2 = null;
        private ComposizioneColoreExt m_composizioneFormula = null;
        private string m_oldCodiceColore = string.Empty;
        private Color m_oldColor = COLORE_RIGA1;

        public ComposizioneColoreManagerExt2()
        {
            InitializeComponent();
        }

        public override void InitializeForm()
        {
            base.InitializeForm();

            if (!this.DesignMode)
            {
                this.objectListView1.ShowGroups = false;

                this.ShowCNFGMenu = true;

                this.splitContainer1.Panel2Collapsed = true;

                this.AddCustomButton("btnAssociaPolvere", "Nuova Formula");
                this.AddCustomButton("btnStampa", "Stampa");

                pf = new ComposizioneColoreFacadeExt();

                this.CanModify = true;
                this.ShowOnlyCustomButton = true;
                //this.AllowNormalButtonManagment = true;
                this.ButtonClicked += new EventHandler<CustomEventArgs<ComposizioneColore2>>(Anagrafica_ButtonClicked);
                this.ItemSelected += new EventHandler<CustomEventArgs<ComposizioneColore2>>(Anagrafica_ItemSelected);
                this.CustomButtonClicked += new EventHandler<CustomEventArgs<ComposizioneColore2>>(Anagrafica_CustomButtonClicked);

                this.objectListView1.FormatRow += new EventHandler<FormatRowEventArgs>(objectListView1_FormatRow);
                // using pager...
                //this.ShowPager = true;
                //pf.Pager = this.Pager;
                //this.Pager.PageChanged += new EventHandler<NavigationEventArgs>(Pager_PageChanged);
                //this.Pager.InitializeControl();

                //pf.GetNumberOfPages();

                this.ShowFilterTracing = true;

                this.Filter.EnableDatesChooser = false;

                InizializzaDati();

                ManageData();
            }

            CreateGroupHeaderFormatters();

            //RefreshColumns();
        }

        void objectListView1_FormatRow(object sender, FormatRowEventArgs e)
        {
            ComposizioneColore2 cc = (ComposizioneColore2)((OLVListItem)e.Item).RowObject;

            if (cc.CodiceColore != m_oldCodiceColore)
            {
                m_oldCodiceColore = cc.CodiceColore;
                m_oldColor = (m_oldColor == COLORE_RIGA1 ? COLORE_RIGA2 : COLORE_RIGA1);
            }

            e.Item.BackColor = m_oldColor;
        }

        private void CreateGroupHeaderFormatters()
        {
            this.olvColumn1.GroupFormatter = delegate(OLVGroup group, GroupingParameters parms) {               
                group.Header = string.Format("Codice colore: {0}", group.Key);
            };
        }

        private void InizializzaDati()
        {
            System.Security.Principal.IPrincipal m_operatore = System.Threading.Thread.CurrentPrincipal;
            if (m_operatore.IsInRole("Acquisti") || m_operatore.IsInRole("Direzione") ||
                m_operatore.IsInRole("Produzione") || m_operatore.IsInRole("Verniciatura"))
            {
                this.olvColumn4.IsEditable = false;
                this.olvColumn10.IsEditable = false;

                this.EnableButton("btnAssociaPolvere", false);
                this.EnableButton("btnNew", false);
                this.EnableButton("btnDelete", false);
                this.EnableButton("btnModify", false);
                
                //this.objectListView1.RebuildColumns();                
            }
           
        }

        public override void OnFilterExecuted()
        {
            base.OnFilterExecuted();

            this.IsFiltering = true;

            ManageData();
        }

        public override void OnFilterReset()
        {
            base.OnFilterReset();

            this.IsFiltering = false;

            ManageData();
        }

        public override void OnRefreshFilterData()
        {
            base.OnRefreshFilterData();

            ManageData();
        }

        //public override void OnRefreshFilterData()
        //{
        //    // override it only if you want to do custom reload of data...
        //    base.OnRefreshFilterData();
        //}

        private void ManageData()
        {
            if (!this.IsFiltering)
            {
                LoadData(false);
            }
            else
            {
                LoadData(this.Filter.FilterBag);
            }
        }

        private void LoadData(bool selectLast)
        {
            pf.RunAsync<List<ComposizioneColore2>>(()=>pf.GetComposizioneColore2(), (result) =>
            {
                if (result != null)
                {
                    this.objectListView1.AddDecoration(new EditingCellBorderDecoration { UseLightbox = true });
                    this.objectListView1.SetObjects((List<ComposizioneColore2>)result, true);

                    this.SetGridItemSelected(0);
                }
                else
                {
                    this.objectListView1.Items.Clear();

                    this.ResetButtons();
                    this.ClearControls(this.Controls);
                }
            });
        }

        private void LoadData(FilterBase<ComposizioneColori> filter)
        {
            pf.RunAsync<List<ComposizioneColore2>>(() => pf.GetComposizioneColore2(filter), (result) =>
            {
                if (result != null)
                {
                    this.objectListView1.AddDecoration(new EditingCellBorderDecoration { UseLightbox = true });
                    this.objectListView1.SetObjects((List<ComposizioneColore2>)result, true);

                    this.SetGridItemSelected(0);
                }
                else
                {
                    this.objectListView1.Items.Clear();

                    this.ResetButtons();
                    this.ClearControls(this.Controls);
                }
            });
        }

        void Anagrafica_CustomButtonClicked(object sender, CustomEventArgs<ComposizioneColore2> e)
        {
            #region btnStampa
            if (e.ButtonName.Equals("btnStampa", StringComparison.InvariantCultureIgnoreCase))
            {
                List<ComposizioneColore2> data = (this.IsFiltering ? pf.GetComposizioneColore2All(this.Filter.FilterBag) : pf.GetComposizioneColore2All());

                Reports.ReportViewerDialog2 rdv2 = new Reports.ReportViewerDialog2();
                rdv2.Datasource = data;    // pf.GetComposizioneColore2All(); // (List<ComposizioneColore2>)this.objectListView1.Objects;
                rdv2.Report = "ReportComposizioneColore2";
                //rdv2.ReportViewer.PrinterSettings.DefaultPageSettings.Landscape = true;
                rdv2.ReportViewer.ReportError += new Microsoft.Reporting.WinForms.ReportErrorEventHandler(ReportViewer_ReportError);
                rdv2.ShowReport();

                // stampa usando la funzione della ObjectListView...
                //BrightIdeasSoftware.ListViewPrinter lvp = new ListViewPrinter();
                //lvp.ListView = this.objectListView1;
                //lvp.Header = "Composizione Colori";
                //lvp.IsShrinkToFit = true;
                //lvp.DefaultPageSettings.Landscape = true;
                //lvp.ListFont = new System.Drawing.Font(FontFamily.GenericSerif, 8);
                //lvp.ListHeaderFormat.Font = new System.Drawing.Font(FontFamily.GenericSerif, 8);
                //lvp.PrintPreview();
            }
            #endregion

            #region btnAssociaPolvere
            if (e.ButtonName.Equals("btnAssociaPolvere", StringComparison.InvariantCultureIgnoreCase))
            {
                //if (base.Current == null) return;

                CreaFormula();
            }
            #endregion
        }

        void ReportViewer_ReportError(object sender, Microsoft.Reporting.WinForms.ReportErrorEventArgs e)
        {
            Console.WriteLine(e.Exception.Message);
        }

        private void CreaFormula()
        {
            AssociaPolvereDialog apd = new AssociaPolvereDialog();
            apd.IsNew = true;
            if (apd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                if (apd.Polveri != null)
                {
                    m_composizioneFormula = apd.ComposizioneFormula;

                    CustomEventArgs<ComposizioneColore2> pp = new CustomEventArgs<ComposizioneColore2>(Actions.Add, null);
                    Anagrafica_ButtonClicked(this, pp);
                }
            }
        }

        void Anagrafica_ButtonClicked(object sender, CustomEventArgs<ComposizioneColore2> e)
        {
            ComposizioneColoreFacade impf = new ComposizioneColoreFacade();
            ComposizioneColore data = new ComposizioneColore();

            switch (e.Action)
            {
                case Actions.Cancel:

                    break;
                case Actions.New:
                    {
                        base.ClearControls(this.Controls);

                        CreaFormula();
                    }
                    break;
                case Actions.Add:
                    {
                        ComposizioneColoreFacade pppp = new ComposizioneColoreFacade();
                        
                        ComposizioneColoreFacadeExt impfExt = new ComposizioneColoreFacadeExt();
                        List<ComposizioneColoreExt> dataExts = new List<ComposizioneColoreExt>();

                        dataExts.Add(m_composizioneFormula);

                        impfExt.Add(dataExts);

                        LoadData(false);
                    }
                    break;
                case Actions.Modify:
                    {
                        data.ID = base.Current.ID;

                        AssociaPolvereDialog apd = new AssociaPolvereDialog(true);
                        apd.IsNew = false;
                        apd.IsModified = true;
                        apd.Formula = base.Current;
                        DialogResult dr = apd.ShowDialog();
                        if (dr == System.Windows.Forms.DialogResult.OK)
                        {
                            ComposizioneColoreExt obj = apd.ComposizioneFormula;

                            ComposizioneColoreFacadeExt impfExt = new ComposizioneColoreFacadeExt();
                            impfExt.Modify(obj);
                        }

                        LoadData(false);
                    }
                    break;
                case Actions.Delete:
                    {
                        data.ID = base.Current.ID;

                        ComposizioneColoreFacadeExt impfExt = new ComposizioneColoreFacadeExt();
                        ComposizioneColoreExt cc = impfExt.Get(data.ID);

                        impfExt.DeleteByColore(cc);

                        LoadData(false);
                    }
                    break;
                default:
                    break;
            }
        }

        void objectListViewColori_ItemCheck(object sender, ItemCheckEventArgs e)
        {

        }

        void objectListViewPolveri_ItemCheck(object sender, ItemCheckEventArgs e)
        {

        }

        void Anagrafica_ItemSelected(object sender, CustomEventArgs<ComposizioneColore2> e)
        {
            base.Current = e.Item;
        }

        public override void OnLoadConfigurazioneMaschera()
        {
            base.OnLoadConfigurazioneMaschera();
        }

        public override void OnRipristinaConfigurazioneDefaultMaschera()
        {
            base.OnRipristinaConfigurazioneDefaultMaschera();
        }

        public override void OnSalvaConfigurazioneMaschera()
        {
            base.OnSalvaConfigurazioneMaschera();

            byte[] data = this.objectListView1.SaveState();

            System.Security.Principal.IPrincipal m_operatore = System.Threading.Thread.CurrentPrincipal;
            string[] roles = System.Web.Security.Roles.GetRolesForUser(m_operatore.Identity.Name);

            SavingConfigurationBag scb = new SavingConfigurationBag();
            scb.FormName = this.Name;
            scb.RoleName = roles[0];

            ColumnsConfigurationManager ccm = new ColumnsConfigurationManager();
            ccm.Configuration = scb;
            ccm.State = data;
            ccm.SaveState();
        }

        private void RefreshColumns()
        {
            ColumnsConfigurationManager ccm = new ColumnsConfigurationManager();
            byte[] state = ccm.GetState(this.Name);

            if (state != null)
            {
                bool result = this.objectListView1.RestoreState(state);
            }
        }
    }

    public class ComposizioneColoreBaseExt2 : AnagraficaManagerFilteredObjectListView<ComposizioneColore2, ComposizioneColoreManagerExtFilter, ComposizioneColoriExtFilterBag> { }

    //public class ComposizioneColoreBaseExt2 : AnagraficaManagerObjectListView<ComposizioneColore2> { }
}
